﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Servico;
using System.Data;
using System.Xml;
using System.IO;
using System.Text;

public partial class ConsultarPlaneamentoGeral : System.Web.UI.Page
{
    Service1 servico = new Service1();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["Email"] != null)
        {
            if (!Session["Nivel"].ToString().Equals("6")) // Se for um tecnico
            {
                PanelGerarEscalonamento.Visible = false;
                Literal lit1 = new Literal();
                lit1.Text = "<ul class=\"bottom\"><li class=\"first\"><a href=\"ConsultarPlaneamentoPessoal.aspx\">Consultar Planeamento Pessoal</a></li><li><a href=\"ConsultarPlaneamentoGeral.aspx\">Consultar Planeamento Geral</a></li><li><a href=\"RegistarTarefas.aspx\">Registar Tarefas</a></li></ul>";
                Menu_Funcionalidades.Controls.Add(lit1);
            }
            else if (Session["Nivel"].ToString().Equals("6")) // Se for um funcionario de Call Center
            {
                PanelGerarEscalonamento.Visible = true;
                Literal lit1 = new Literal();
                lit1.Text = "<ul class=\"bottom\"><li class=\"first\"><a href=\"SubmeterPedido.aspx\">Submeter Pedido</a></li><li><a href=\"RegistarCliente.aspx\">Registar Cliente</a></li><li><a href=\"ConsultarPlaneamentoGeral.aspx\">Consultar Planeamento Geral</a></li></ul>";
                Menu_Funcionalidades.Controls.Add(lit1);
            }

            string planXML = servico.consultarPlaneamentoGeral(DateTime.Now);

            Literal lit = new Literal();

            lit.Text = "<p class=\"bottom\">" +
                        "<div style=\"position:relative\" class=\"gantt\" id=\"GanttChartDIV\"></div>" +
                        "<script language=\"javascript\">" +
                            "var g = new JSGantt.GanttChart('g', document.getElementById('GanttChartDIV'), 'hour');" +

                            "g.setShowRes(1);" +
                            "g.setShowDur(0);" +
                            "g.setShowComp(0);" +
                            "g.setCaptionType('Caption');" +

                            "g.setShowStartDate(0);" +
                            "g.setShowEndDate(0);" +
                            "g.setCaptionType('Resource');" +
                            "g.setDateInputFormat('mm/dd/yyyy');" +
                            "g.setDateDisplayFormat('dd/mm/yyyy');" +
                            "g.setFormatArr(\"hour\");" +     //\"minute\",\"hour\",\"day\",\"week\

                            xmlGetItems(planXML) +

                            "g.Draw();" +
                            "g.DrawDependencies();" +
                        "</script>" +
                    "</p>";
            PanelGantt.Controls.Add(lit);

        }

        else
        {
            Session["Erro"] = "Por favor autentique-se!";
            Response.Redirect("Home.aspx");
        }


        MensagemErro();

    }

    public string xmlGetItems(string planXML)
    {
        int pID = 1;
        int pos1, pos2, pos1aux, ajuda;
        string aux = planXML, compare, fim, nomeCliente, moradaCliente,  cliente;
        bool encontrado = false, temNome = true;
        StringBuilder output = new StringBuilder();
        Dictionary<string, int> dictionaryPIDpedido = new Dictionary<string, int>();  //dicionário que terá os ids dos pedidos e os respectivos pID
        int paiID = 0, filhoID = 0;
        string descricaoPedido = "", descricaoTarefa = "", horaInicio = "", horaFim = "", nome = "";

        pos1 = aux.IndexOf("<Nome>");

        while (pos1 != -1)
        {
            pos1 = aux.IndexOf("<idPedidoRecebido>");
            aux = aux.Substring(pos1);
            pos2 = aux.IndexOf("</idPedidoRecebido>");
            compare = aux.Substring(18, pos2 - 18);   //18 é o numero de caracteres de '<idPedidoRecebido>'

            foreach (string id in dictionaryPIDpedido.Keys)
            {
                if (compare.Equals(id)) encontrado = true;
            }

            if (!encontrado)
            {
                dictionaryPIDpedido.Add(compare, pID);
                paiID = pID;
                pID++;
            }
            else
            {
                encontrado = false;
                aux = aux.Substring(pos2);
                pos1 = aux.IndexOf("<idPedidoRecebido>");
                continue;
            }

            aux = aux.Substring(pos2);
            pos1 = aux.IndexOf("<NomeCliente>");
            aux = aux.Substring(pos1);
            pos2 = aux.IndexOf("</NomeCliente>");

            compare = aux.Substring(13, pos2 - 13);
            nomeCliente = compare;

            aux = aux.Substring(pos2);
            pos1 = aux.IndexOf("<DesignacaoPedido>");
            aux = aux.Substring(pos1);
            pos2 = aux.IndexOf("</DesignacaoPedido>");

            compare = aux.Substring(18, pos2 - 18);
            descricaoPedido = compare;

            aux = aux.Substring(pos2);
            pos1 = aux.IndexOf("<Morada>");
            aux = aux.Substring(pos1);
            pos2 = aux.IndexOf("</Morada>");

            compare = aux.Substring(8, pos2 - 8);
            moradaCliente = compare;

            cliente = nomeCliente + "," + moradaCliente.Replace(", ",",").Replace(" ","_");

            output.Append("g.AddTaskItem(new JSGantt.TaskItem(" + paiID + ", '" + descricaoPedido + "', '', '', 'ff0000', '" + cliente + "', 0, '', 0, 1, 0,  1));"); //" + cliente + "

            fim = aux;
            aux = planXML;
            temNome = true;

            pos1 = aux.IndexOf("<Nome>");

            while (pos1 != -1)
            {
                if (temNome)
                {
                    aux = aux.Substring(pos1);
                    pos2 = aux.IndexOf("</Nome>");

                    compare = aux.Substring(6, pos2 - 6);   //6 é o numero de caracteres de '<Nome>'
                    nome = compare;   //guarda o nome do tecnico
                    temNome = false;
                }

                pos1 = aux.IndexOf("<idPedidoRecebido>");
                aux = aux.Substring(pos1);
                pos2 = aux.IndexOf("</idPedidoRecebido>");
                compare = aux.Substring(18, pos2 - 18);   //18 é o numero de caracteres de '<idPedidoRecebido>'

                if (!dictionaryPIDpedido.ContainsKey(compare))
                {
                    aux = aux.Substring(pos2);
                    pos1 = aux.IndexOf("<Tarefa id=");
                    pos1aux = aux.IndexOf("<Nome>");
                    if (pos1aux < pos1)
                    {
                        temNome = true;
                        pos1 = pos1aux;
                    }
                    continue;
                }

                if (dictionaryPIDpedido[compare] != paiID)
                {
                    aux = aux.Substring(pos2);
                    pos1 = aux.IndexOf("<Tarefa id=");
                    pos1aux = aux.IndexOf("<Nome>");
                    if (pos1aux < pos1)
                    {
                        temNome = true;
                        pos1 = pos1aux;
                    }
                    continue;
                }

                filhoID = pID;
                pID++;

                aux = aux.Substring(pos2);
                pos1 = aux.IndexOf("<HoraInicialTarefa>");
                aux = aux.Substring(pos1);
                pos2 = aux.IndexOf("</HoraInicialTarefa>");

                compare = aux.Substring(19, pos2 - 19);
                horaInicio = compare.Replace("-", "/");
                ajuda = horaInicio.IndexOf(":00");
                horaInicio = formatHora(horaInicio.Remove(ajuda, 3));

                aux = aux.Substring(pos2);
                pos1 = aux.IndexOf("<HoraFimTarefa>");
                aux = aux.Substring(pos1);
                pos2 = aux.IndexOf("</HoraFimTarefa>");

                compare = aux.Substring(15, pos2 - 15);
                horaFim = compare.Replace("-", "/");
                ajuda = horaFim.IndexOf(":00");
                horaFim = formatHora(horaFim.Remove(ajuda, 3));

                aux = aux.Substring(pos2);
                pos1 = aux.IndexOf("<DesignacaoTarefa>");
                aux = aux.Substring(pos1);
                pos2 = aux.IndexOf("</DesignacaoTarefa>");

                compare = aux.Substring(18, pos2 - 18);
                descricaoTarefa = compare;


                output.Append("g.AddTaskItem(new JSGantt.TaskItem(" + filhoID + ", '" + descricaoTarefa + "', '" + horaInicio + "', '" + horaFim + "', 'ff0000', '" + cliente + "', 0, '" + nome + "', 100, 0, " + paiID + ", 1));");

                aux = aux.Substring(pos2);
                pos1 = aux.IndexOf("<idPedidoRecebido");
                pos1aux = aux.IndexOf("<Nome>");
                if (pos1aux < pos1)
                {
                    temNome = true;
                    pos1 = pos1aux;
                }

            }

            //aux = fim;
            aux = planXML;

            aux = aux.Substring(pos2);
            pos1 = aux.IndexOf("<Tarefa id=");
            pos1aux = aux.IndexOf("<Nome>");
            if (pos1aux < pos1)
            {
                temNome = true;
                pos1 = pos1aux;
            }
        }

        return output.ToString();
        /*"g.AddTaskItem(new JSGantt.TaskItem(1, \'Define Chart API\', \'2/10/2008 09:00\', \'2/10/2008 18:00\', \'ff0000\', \'http://help.com\', 0, \'Brian\', 0, 1, 0, 1));" +
        "g.AddTaskItem(new JSGantt.TaskItem(11, \'Verificar cobertura de linha\', \'2/10/2008 09:00\', \'2/10/2008 11:00\', \'ff00ff\', \'http://www.yahoo.com\', 1, \'Shlomy\', 0, 0, 1, 1, \"121,122\", \"Tarefa x\"));" +
        "g.AddTaskItem(new JSGantt.TaskItem(12, \'Verificar cobertura de linha\', \'2/10/2008 11:00\', \'2/10/2008 15:00\', \'ff00ff\', \'http://www.yahoo.com\', 1, \'Shlomy\', 100, 0, 0, 1, \"11\", \"Tarefa xxx\"));" +*/
    }

    //public string formatMorada(string morada)
    //{
    //    string moradanova = "", aux;
    //    int index = 0, index2 = 0;

    //    while (index2 != -1)
    //    {
    //        morada = morada.Substring(index);
    //        index2 = morada.IndexOf(" ");
    //        aux = morada.Substring(index, index2-index);
    //        moradanova = moradanova + aux;
    //        index = index2 + 1;
    //        index2 = morada.IndexOf(" ");
    //    }


    //        //aux = aux.Substring(pos2);
    //        //pos1 = aux.IndexOf("<NomeCliente>");
    //        //aux = aux.Substring(pos1);
    //        //pos2 = aux.IndexOf("</NomeCliente>");


    //        //antes = index + 1;
    //        //index = morada.index
    //    //}

    //}


    public string formatHora(string hora)
    {
        string dia = hora.Substring(0, 2);
        string mes = hora.Substring(3, 2);
        string data = hora.Substring(5);

        return (mes + "/" + dia + data);

    }

    protected void MensagemErro()
    {
        if (Session["Erro"] != null)
        {
            Literal lit = new Literal();
            lit.Text = "<ul id=\"menu2\"><li>" + Session["Erro"].ToString() + "</li></ul>";
            PanelMsg.Controls.Add(lit);
            Session["Erro"] = null;
        }
        if (Session["Sucesso"] != null)
        {
            Literal lit = new Literal();
            lit.Text = "<ul id=\"menu3\"><li>" + Session["Sucesso"].ToString() + "</li></ul>";
            PanelMsg.Controls.Add(lit);
            Session["Sucesso"] = null;
        }
    }
    protected void ButtonGerarEscalonamento_Click(object sender, EventArgs e)
    {
        if (!servico.verificaExistenciaPlaneamento(DateTime.Now)){
            if (servico.beginEscalonamento())
                Session["Sucesso"] = "Escalonamento gerado com sucesso!";
            else
                Session["Erro"] = "Erro ao gerar o escalonamento!";
        }
        else
            Session["Erro"] = "O escalonamento já foi gerado para o dia de hoje!";

        MensagemErro();
    }
}